#include "znx_cleanup.h"

void
znx_cleanup_list_init(znx_cleanup_list_t *list)
{
    znx_queue_init(&list->head);
}


znx_cleanup_item_t *
znx_cleanup_list_add(znx_cleanup_list_t *list,
    znx_cleanup_handler_pt handler, void *data)
{
    znx_cleanup_item_t  *item;
    item = znx_thread_calloc(sizeof(znx_cleanup_item_t));
    item->handler = handler;
    item->data = data;

    znx_queue_insert_tail(&list->head, &item->queue);

    return item;
}


void
znx_cleanup_list_del(znx_cleanup_list_t *list, znx_cleanup_item_t *item)
{
    if (!znx_queue_inited(&item->queue)) {
        return;
    }

    znx_queue_remove(&item->queue);

    znx_thread_free(item);
}


void
znx_cleanup_list_exec(znx_cleanup_list_t *list)
{
    znx_cleanup_item_t   *item = NULL;
    znx_queue_t          *q;

    while (!znx_queue_empty(&list->head)) {
        q = znx_queue_last(&list->head);
        item = znx_queue_data(q, znx_cleanup_item_t, queue);
        znx_queue_remove(q);
        if (item->handler) {
            item->handler(item->data);
        }
        znx_thread_free(item);
    }
}
